home *** CD-ROM | disk | FTP | other *** search
/ PC Media 4 / PC MEDIA CD04.iso / share / prog / pcl4c42 / modem_io.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-21  |  4.3 KB  |  192 lines

  1. /*** MODEM_IO.C ***/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #include "pcl4c.h"
  8. #include "ascii.h"
  9. #include "modem_io.h"
  10. #include "term_io.h"
  11.  
  12. #define FALSE 0
  13. #define TRUE !FALSE
  14. #define ONE_SECOND 18
  15.  
  16. /* NOTE: Requires AT COMMAND SET for all functions in this file */
  17.  
  18. static int LastPort;             /* last port referenced */
  19.  
  20. /*** PRIVATE functions ***/
  21.  
  22. static int BreakTest(void)
  23. {/* User BREAK ? */
  24.  if(SioBrkKey()||SioKeyPress())
  25.     {printf("User BREAK\n");
  26.      return(TRUE);
  27.     }
  28.  return(FALSE);
  29. }
  30.  
  31. /*** PUBLIC functions ***/
  32.  
  33. /* echos incoming to screen */
  34.  
  35. void ModemEcho(int Port,int Echo)
  36. {int rc;
  37.  long Time;
  38.  Time = SioTimer();
  39.  while(SioTimer() < Time+(long)Echo)
  40.    {rc = CharGet(Port,1);
  41.     if(rc>=0) printf("%c",(char)rc);
  42.    }
  43. }
  44.  
  45. /* send string to modem & get echo */
  46.  
  47. int ModemSendTo(
  48.   int  Port,       /* port to talk to */
  49.   int  Pace,       /* inter-char delay */
  50.   char *String)    /* string to send to modem */
  51. {int i, rc;
  52.  char c;
  53.  int Code;
  54.  long Time;
  55.  for(i=0;i<strlen(String);)
  56.     {/* User BREAK ? */
  57.      if(BreakTest()) return(FALSE);
  58.      /* delay <Pace> tics */
  59.      if(Pace>0) ModemEcho(Port,Pace);
  60.      /* fetch character */
  61.      c = String[i++];
  62.      switch(c)
  63.         {case '^':
  64.             /* next char is control char */
  65.             c = String[i++] - '@';
  66.             break;
  67.          case '!':
  68.             /* replace ! with carriage return */
  69.             c = CR;
  70.             break;
  71.          case '~':
  72.             /* delay 1/2 second */
  73.             SioDelay(ONE_SECOND/2);
  74.             c = ' ';
  75.             break;
  76.          case ' ':
  77.             /* delay 1/4 second */
  78.             SioDelay(ONE_SECOND/4);
  79.             c = ' ';
  80.             break;
  81.         } /* end switch */
  82.      /* transmit as 7 bit ASCII character */
  83.      CharPut(Port,(char)(0x7f & c));
  84.     }
  85.  return(TRUE);
  86. } /* end SendTo */
  87.  
  88. /* wait for 'String' */
  89.  
  90. /* NOTES:
  91. **  (1)  Be sure to call ModemSendTo with Echo=0 if you will then
  92. **       call ModemWaitFor() to check for the response
  93. */
  94.  
  95. int ModemWaitFor(
  96.   int Port,        /* Port to talk to */
  97.   int  Tics,       /* wait in tics for string */
  98.   int  CaseFlag,   /* TRUE = case sensitive compares */
  99.   char *String)    /* string to wait for */
  100. {int i, k;
  101.  char c1, c2;
  102.  int Code;
  103.  char *Ptr;
  104.  long Time;
  105.  /* wait for string */
  106.  Time = SioTimer();
  107.  Ptr = String;
  108.  while(SioTimer()<(Time+(long)Tics))
  109.    {/* User BREAK ? */
  110.     if(BreakTest()) return(FALSE);
  111.     /* wait for next character */
  112.     Code = CharGet(Port,1);
  113.     if(Code<-1) return(FALSE);
  114.     if(Code>=0)
  115.       {/* echo char */
  116.        printf("%c",(char)Code);
  117.        /* prepare chars */
  118.        c1 = *Ptr++;
  119.        c2 = (char)Code;
  120.        /* case sensitive ? */
  121.        if(!CaseFlag)
  122.          {c1 = toupper(c1);
  123.           c2 = toupper(c2);
  124.          }
  125.        /* does char match ? */
  126.        if(c1==c2)
  127.          {if(*Ptr=='\0') return TRUE;
  128.          }
  129.        else Ptr = String;
  130.       }
  131.    } /* end for(i) */
  132.  return FALSE;
  133. }
  134.  
  135. /* enter command state */
  136.  
  137. /* NOTE: assumes escape char = '+' & guard time = 1 sec */
  138.  
  139. void ModemCmdState(int Port)
  140. {int i;
  141.  /* delay a bit over 1 second */
  142.  SioDelay(ONE_SECOND+ONE_SECOND/4);
  143.  /* send Escape Code exactly 3 times */
  144.  for(i=0;i<3;i++)
  145.     {CharPut(Port,'+');
  146.      SioDelay(ONE_SECOND/4);
  147.     }
  148.  /* delay again */
  149.  SioDelay(ONE_SECOND+ONE_SECOND/4);
  150. } /* end ModemCmdState */
  151.  
  152. /* hangup phone (in command state) */
  153.  
  154. void ModemHangup(int Port)
  155. {/* enter command state */
  156.  ModemCmdState(Port);
  157.  /* hangup ! */
  158.  ModemSendTo(Port,4,"!AT!");
  159.  ModemEcho(Port,10);
  160.  ModemSendTo(Port,4,"ATH0!");
  161. } /* end Hangup */
  162.  
  163. /* wait for continuous quiet (no incoming serial data) */
  164.  
  165. int ModemQuiet(
  166.   int  Port,       /* Port to talk to */
  167.   int  Tics)       /* # tics quiet required */
  168. {int i;
  169.  int Code;
  170.  long CharTime;
  171.  /* set up */
  172.  CharTime = SioTimer();
  173.  while(1)
  174.    {/* User BREAK ? */
  175.     if(BreakTest())
  176.       {
  177.        return(FALSE);
  178.       }
  179.     /* wait for next character */
  180.     Code = CharGet(Port,1);
  181.     if(Code<-1) return(FALSE);
  182.     if(Code>=0)
  183.       {CharTime = SioTimer();
  184.        printf("%c",(char)Code);
  185.       }
  186.     else
  187.       {/* ==-1, timed out */
  188.        if(SioTimer() >= CharTime+(long)Tics) return TRUE;
  189.       }
  190.    } /* end while */
  191. }
  192.